package org.cnam.mobileShopping.view;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.cnam.mobileShopping.R;
import org.cnam.mobileShopping.bean.Category;
import org.cnam.mobileShopping.bean.Constants;
import org.cnam.mobileShopping.bean.Contact;
import org.cnam.mobileShopping.bean.MList;
import org.cnam.mobileShopping.bean.Product;
import org.cnam.mobileShopping.bean.Productlist;
import org.cnam.mobileShopping.bean.User;
import org.cnam.mobileShopping.controller.CategoryController;
import org.cnam.mobileShopping.controller.ContactController;
import org.cnam.mobileShopping.controller.ListeController;
import org.cnam.mobileShopping.controller.ProductController;
import org.cnam.mobileShopping.controller.ProductListController;
import org.cnam.mobileShopping.dao.DAOFactory;
import org.cnam.mobileShopping.util.MobileShoppingUtils;
import org.cnam.mobileShopping.util.PatternUtil;
import org.cnam.mobileShopping.wsclient.WSClient;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Page permettant de visualiser tous les produits d'une liste
 * 
 * @author laurent
 * 
 */
public class ShowProductList extends Activity {

	/** L'adapter de la liste permettant de la manager */
	private ArrayAdapter<Productlist> adapter;
	/** La liste qui est en train d'être mise à jour */
	private MList list;
	// boolean qui permet se savoir si la liste est en mode "faire les courses"
	private boolean isShoppingModeActivated = false;
	// la liste avec les produits
	private ListView lView;
	// les produits de la liste
	List<Productlist> products = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// affichage de tous les éléments dans le layout
		setContentView(R.layout.showproductlist);

		adapter = new ArrayAdapter<Productlist>(ShowProductList.this,
				android.R.layout.simple_list_item_1);

		// récupération des extra
		Integer idListe = getIntent().getIntExtra("idListe", -1);
		// on retrouve la liste
		list = getSelectedListe(idListe);

		TextView title = (TextView) findViewById(R.id.labelProduitListe);
		if (list != null) {
			String titre = list.getLabel();
			if (list.getStatus() == Constants.statusList.ENCOURSCOURSE.getId()) {
				titre += " (" + getResources().getString(R.string.list_locked)
						+ ")";
			}
			// et on met le libellé de la liste en titre
			title.setText(titre);

			// si la liste est verouillé, on ne peux pas rajouter des produits
			// mais on px continuer a en acheter
			if (list.getStatus().intValue() == Constants.statusList.ENCOURSCOURSE
					.getId()) {
				isShoppingModeActivated = true;
			}

			// remplissage de laliste avec les produits de la liste
			fillTheList(list);
		}

	}

	/* Creates the menu items */
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu_liste_produit, menu);
		return true;
	}

	/**
	 * cette methode est appelee a chaque fois qu'on ouvre le menu android. on
	 * adapte le menu en fonction du status de la liste
	 */
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		// en mode shopping, on n'a plus la possibilite d'ajouter des produits
		if (isShoppingModeActivated) {
			// mode shopping
			// on a PAS la possibilite d'ajouter des produits, de passer en mode
			// shopping
			// on a la possibilite de revenir en mode normal ou de valider son
			// shopping ?
			menu.findItem(R.id.menu_add_produit_categorie).setVisible(false);
			menu.findItem(R.id.menu_add_produit_barcode).setVisible(false);
			menu.findItem(R.id.menu_make_shopping).setVisible(false);
			menu.findItem(R.id.menu_cancel_shopping).setVisible(true);
			menu.findItem(R.id.menu_validate_shopping).setVisible(true);

		} else {
			// mode normal
			// on a la possibilite d'ajouter des produits, de passer en mode
			// shopping
			// on a PAS la possibilite d'annuler le mode shopping ou de valider
			// son shopping
			menu.findItem(R.id.menu_cancel_shopping).setVisible(false);
			menu.findItem(R.id.menu_validate_shopping).setVisible(false);
			menu.findItem(R.id.menu_add_produit_categorie).setVisible(true);
			menu.findItem(R.id.menu_add_produit_barcode).setVisible(true);
			menu.findItem(R.id.menu_make_shopping).setVisible(true);
		}

		// mode offline : on desactive le partage/la recherche de magasins/
		// ajout de produit dans le référentiel ...
		if (!MobileShoppingUtils.isConnected(ShowProductList.this)) {
			menu.findItem(R.id.menu_share_list).setVisible(false);
			menu.findItem(R.id.menu_find_store).setVisible(false);
			menu.findItem(R.id.menu_send_list).setVisible(false);
			menu.findItem(R.id.menu_add_produit_barcode).setVisible(false);
		}
		// si on a valide les courses, on a plus la possibilite de valider ou
		// d'annuler les achats
		if (list != null
				&& list.getStatus() == Constants.statusList.ENCOURSCOURSE
						.getId()) {
			menu.findItem(R.id.menu_cancel_shopping).setVisible(false);
			menu.findItem(R.id.menu_validate_shopping).setVisible(false);
		}
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle item selection
		switch (item.getItemId()) {
		case R.id.menu_add_produit_categorie:
			addProductCategorie();
			return true;
		case R.id.menu_add_produit_barcode:
			addProductScan();
			return true;
		case R.id.menu_share_list:
			shareList();
			return true;
		case R.id.menu_send_list:
			sendList();
			return true;
		case R.id.menu_make_shopping:
			makeShopping();
			return true;
		case R.id.menu_find_store:
			goToMapsStore();
			return true;
		case R.id.menu_cancel_shopping:
			cancelShopping();
			return true;
		case R.id.menu_validate_shopping:
			validateShopping();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	private void makeShopping() {
		isShoppingModeActivated = true;
	}

	private void cancelShopping() {
		isShoppingModeActivated = false;
		for (int i = 0; i < adapter.getCount(); i++) {
			// on passe le fond des produits en noir et on reactive les lignes
			if (lView.getChildAt(i) != null) {
				lView.getChildAt(i).setBackgroundColor(Color.BLACK);
				lView.getChildAt(i).setEnabled(true);
			}
			Productlist pl = adapter.getItem(i);
			pl.setStatusid(Integer.valueOf(Constants.statusProductInList.NOTBUY
					.getId()));

		}
	}

	private void validateShopping() {

		for (int i = 0; i < adapter.getCount(); i++) {
			// on fait un update de chaque produitList de la liste
			Productlist pl = adapter.getItem(i);
			// ######decommenter ici
			ProductListController.update(ShowProductList.this, pl);
			String strAchete = "- acheté: ";
			if (pl.getStatusid().intValue() == Constants.statusProductInList.BUY
					.getId()) {
				strAchete += " OUI";
			} else {
				strAchete += " NON";
			}
			Toast.makeText(
					ShowProductList.this,
					"Validation achat du produit:"
							+ pl.getProduct().getDescription() + strAchete,
					Toast.LENGTH_LONG).show();
		}
		list.setStatus(Constants.statusList.ENCOURSCOURSE.getId());
		ListeController.updateList(ShowProductList.this, list);
	}

	/**
	 * Récupération de la liste stockée en base de données
	 * 
	 * @param idListe id de la liste à charger
	 * @return La liste souhaitée
	 */
	private MList getSelectedListe(Integer idListe) {
		return DAOFactory.getListeDAO(this).find(idListe);
	}

	/**
	 * Remplissage de la liste avec tous les produits contenus dans la liste que
	 * l'on a récupéré
	 * 
	 * @param l La liste qui contient les produits
	 */
	private void fillTheList(MList l) {

		lView = (ListView) findViewById(R.id.listOfListe);
		// la liste qui va contenir toutes les listes de courses que peux voir
		// un utilisateur
		lView.setAdapter(adapter);

		// on récupère les productlist de cette liste
		/*
		 * products = ((ProductlistDAO) DAOFactory
		 * .getProductListDAO(ShowProductList.this)).findByList(l
		 * .getMlistid());
		 */

		products = ProductListController.findByList(ShowProductList.this,
				l.getMlistid());

		for (Productlist p : products) {
			// on récupère le produit associé
			// p.setProduct(DAOFactory.getProductDAO(ShowProductList.this).find(
			// p.getProductid()));
			p.setProduct(ProductController.getProduct(ShowProductList.this,
					p.getProductid()));
			adapter.add(p);
		}

		// ajout du clic long sur les items de la liste
		lView.setOnItemLongClickListener(new OnItemLongClickListener() {
			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View v,
					final int position, long id) {
				// menu sur le click long d'un item
				// si la liste est en mode Shopping, on a la possibilite
				// d'anuler l'achat
				List<String> listMenuToDisplay = new ArrayList<String>();
				listMenuToDisplay.add("Supprimer le produit");
				if (isShoppingModeActivated) {
					listMenuToDisplay.add(" Annuler l'achat");
				}
				final CharSequence[] items = new CharSequence[listMenuToDisplay
						.size()];
				for (int i = 0; i < listMenuToDisplay.size(); i++) {
					items[i] = listMenuToDisplay.get(i);
				}

				AlertDialog.Builder builder = new AlertDialog.Builder(
						ShowProductList.this);
				builder.setTitle(R.string.actions);
				builder.setItems(items, new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int item) {
						Productlist pl = adapter.getItem(position);
						switch (item) {

						case 0:
							// suppression du produit de la liste
							// et on lance la suppression de cet objet
							ProductListController.delete(ShowProductList.this,
									pl);
							// maintenant on l'enlève de la liste visuelle
							adapter.remove(pl);
							break;

						case 1:
							// annuler l'achat
							// on remet le fond en noir et on reactive l'item
							pl.setStatusid(Integer
									.valueOf(Constants.statusProductInList.NOTBUY
											.getId()));
							lView.getChildAt(position).setBackgroundColor(
									Color.BLACK);
							lView.getChildAt(position).setEnabled(true);

							break;
						default:
							break;
						}
					}
				});
				AlertDialog alert = builder.create();
				alert.show();

				return true;
			}
		});

		// ajout du clic rapide sur les items de la liste
		lView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {

				Productlist p = adapter.getItem(position);
				// si on est en mode shopping, on change la couleur de la ligne
				// et on la desactive
				if (isShoppingModeActivated) {
					view.setBackgroundColor(Color.RED);
					view.setEnabled(false);
					p.setStatusid(Integer
							.valueOf(Constants.statusProductInList.BUY.getId()));
				} else {
					// sinon on recupere le produit pour un update
					p = adapter.getItem(position);
					updateProduct(p);
				}

			}
		});

		// on initialise la la liste avec les produits acheté en rouge si les
		// courses ont deja ete faite
		if (list.getStatus() == Constants.statusList.ENCOURSCOURSE.getId()) {
			Productlist pl = null;
			View view = null;
			/*
			 * for (int i = 0; i < adapter.getCount(); i++) { pl =
			 * adapter.getItem(i);
			 * 
			 * // on passe le fond des produits en noir et on reactive les
			 * lignes //PROBLEME ICI: lView.getChildAt(i) est toujour null, je
			 * sais pas pourquoi, du coup je mets toute la liste en desabled...
			 * if (pl.getStatusid().intValue() ==
			 * Constants.statusProductInList.BUY.getId() && lView.getChildAt(i)
			 * != null) { lView.getChildAt(i).setBackgroundColor(Color.RED);
			 * lView.getChildAt(i).setEnabled(true); } }
			 */
			lView.setEnabled(false);
			// lView.setBackgroundColor(Color.RED);

		}
	}

	/**
	 * Edition/Modification d'un produit de la liste.
	 */
	private void updateProduct(final Productlist productToUpdate) {

		final Dialog updateProductDialog = new Dialog(ShowProductList.this);

		updateProductDialog.setContentView(R.layout.updateproduct);
		// updateProductDialog.setTitle(R.string.update_product);
		updateProductDialog.setTitle(productToUpdate.getProduct()
				.getDescription());

		updateProductDialog.getWindow().setLayout(LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT);

		updateProductDialog.setCancelable(true);
		Button buttonCancel = (Button) updateProductDialog
				.findViewById(R.id.btnCancel);
		Button buttonOk = (Button) updateProductDialog.findViewById(R.id.btnOk);

		// widgets de quantité
		ImageButton buttonLess = (ImageButton) updateProductDialog
				.findViewById(R.id.btnQteLess);
		ImageButton buttonMore = (ImageButton) updateProductDialog
				.findViewById(R.id.btnQteMore);
		final TextView txtQte = (TextView) updateProductDialog
				.findViewById(R.id.txtQte);
		txtQte.setText("" + productToUpdate.getQuantity());
		buttonLess.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Integer qte = Integer.parseInt(txtQte.getText().toString());
				if (qte > 1) {
					qte--;
					txtQte.setText(qte.toString());
				}
			}
		});
		buttonMore.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Integer qte = Integer.parseInt(txtQte.getText().toString());
				qte++;
				txtQte.setText(qte.toString());
			}
		});

		buttonCancel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				updateProductDialog.dismiss();
			}
		});

		buttonOk.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// on recupere les infos
				Integer quantite = Integer
						.parseInt(txtQte.getText().toString());
				productToUpdate.setQuantity(quantite);
				int version = productToUpdate.getVersion();
				productToUpdate.setVersion(version + 1);
				// et on lance la mise à jour au WS et dans la base de données
				ProductListController.update(ShowProductList.this,
						productToUpdate);
				adapter.notifyDataSetChanged();

				updateProductDialog.cancel();
			}
		});

		updateProductDialog.show();
	}

	/**
	 * Ajout d'un produit dans une liste par catégorie, c'est à dire qu'on va
	 * demander à l'utilisateur par catégorie quel produit il veut ajouter
	 */
	private void addProductCategorie() {
		// ouverture de la dialogue
		final Dialog dialog = new Dialog(ShowProductList.this);
		dialog.setContentView(R.layout.choose_product_categorie);
		dialog.setTitle(R.string.add_produit);

		dialog.getWindow().setLayout(LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT);

		dialog.setCancelable(true);

		// on charge le contenu du spinner
		final Spinner spCategorie = (Spinner) dialog
				.findViewById(R.id.spCategorie);
		// on récupère les catégories disponibles en base locale
		List<Category> categories = DAOFactory.getCategoryDAO(
				ShowProductList.this).findAll();
		List<? extends Map<String, ?>> mapcategories = CategoryController
				.buildMapCategories(categories);
		/*
		 * ArrayAdapter.createFromResource( this, R.array.categories,
		 * android.R.layout.simple_spinner_item);
		 */
		String[] from = new String[] { "line1" };
		int[] to = new int[] { android.R.id.text1 };
		spCategorie.setAdapter(new SimpleAdapter(this, mapcategories,
				android.R.layout.simple_spinner_item, from, to));

		// récupération du spinner concernant les produits
		final Spinner spProduit = (Spinner) dialog.findViewById(R.id.spProduit);
		spProduit.setEnabled(Boolean.FALSE);

		// mise en place du bouton oui
		final Button buttonYes = (Button) dialog
				.findViewById(R.id.dialogBtnYes);
		buttonYes.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// preums on récupère toutes les infos
				Map<String, Product> prod = (Map<String, Product>) spProduit
						.getSelectedItem();
				Product p = prod.get("line1");

				Productlist pl = new Productlist(list.getMlistid(), -1, 1,
						Integer.valueOf(Constants.statusProductInList.NOTBUY
								.getId()), Integer.parseInt(MobileShoppingUtils
								.getSharedPreferences(ShowProductList.this,
										"userid")), p.getProductid(),
						new Date());
				pl.setProduct(p);

				pl = ProductListController.createProductList(
						ShowProductList.this, pl);
				pl.setProduct(p);
				appendProduct(pl);
				dialog.cancel();
			}
		});
		// on place le bouton à disabled car on veut qu'il soit dispo uniquement
		// lorsqu'on a choisit un produit
		buttonYes.setEnabled(Boolean.FALSE);
		// mise en place du bouton non
		Button buttonNo = (Button) dialog.findViewById(R.id.dialogBtnNo);
		buttonNo.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dialog.cancel();
			}
		});
		// on place l'écouteur sur la sélection de catégorie
		spCategorie.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {

				Map<String, Category> cat = (Map<String, Category>) parent
						.getItemAtPosition(position);
				final Category c = cat.get("line1");

				if (c == null) {
					spProduit.setEnabled(Boolean.FALSE);
					buttonYes.setEnabled(Boolean.FALSE);
				} else {
					// ok donc là on va loader la liste de produit correct dans
					// la liste déroulante

					// on récupère les catégories disponibles en base locale
					List<Product> products = ProductController
							.getProductByCategory(ShowProductList.this, c);
					List<? extends Map<String, ?>> mapProducts = ProductController
							.buildMapProducts(products);
					/*
					 * ArrayAdapter.createFromResource( this,
					 * R.array.categories,
					 * android.R.layout.simple_spinner_item);
					 */
					String[] from = new String[] { "line1" };
					int[] to = new int[] { android.R.id.text1 };
					spProduit.setAdapter(new SimpleAdapter(
							ShowProductList.this, mapProducts,
							android.R.layout.simple_spinner_item, from, to));
					spProduit.setEnabled(Boolean.TRUE);
				}
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				// ba on fait rien
				return;
			}
		});
		// on met l'écouteur sur le spinner Produit
		spProduit.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {

				Map<String, Product> prod = (Map<String, Product>) parent
						.getItemAtPosition(position);
				final Product p = prod.get("line1");
				if (p == null) {
					buttonYes.setEnabled(Boolean.FALSE);
				} else {
					buttonYes.setEnabled(Boolean.TRUE);
				}
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				// non toujours rien
				return;
			}
		});
		// Et on affiche !!
		dialog.show();

	}

	/**
	 * Partage de la liste courante avec un autre utilisateur de MobileShopping
	 */
	private void shareList() {

		// ouverture de la dialogue
		final Dialog dialog = new Dialog(ShowProductList.this);
		dialog.setContentView(R.layout.sharelist);
		dialog.setTitle(R.string.share_title);
		dialog.setCancelable(true);

		dialog.getWindow().setLayout(LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT);
		// on remplis la liste par les comptes mobileshopping disponibles
		List<User> users = new ArrayList<User>();
		try {
			users = WSClient.getInstance().getUsers();
		} catch (Exception e) {
			Log.e("MobileShopping", e.getMessage());
		}
		final Spinner spUsers = (Spinner) dialog.findViewById(R.id.spaccount);
		ArrayAdapter<User> adapterUser = new ArrayAdapter<User>(
				ShowProductList.this,
				android.R.layout.simple_spinner_dropdown_item);
		for (User u : users) {
			adapterUser.add(u);
		}
		spUsers.setAdapter(adapterUser);

		// bouton annuler
		Button buttonCancel = (Button) dialog
				.findViewById(R.id.dialogBtnCancel);
		buttonCancel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dialog.cancel();
			}
		});
		// bouton share
		Button buttonShare = (Button) dialog.findViewById(R.id.dialogBtnShare);
		buttonShare.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				User selectedUser = (User) spUsers.getSelectedItem();
				try {
					WSClient.getInstance().sharedList(selectedUser.getUserid(),
							list);
					Toast.makeText(
							ShowProductList.this,
							"Vous venez de partager votre liste avec: "
									+ selectedUser.getPseudo(),
							Toast.LENGTH_LONG).show();
				} catch (Exception e) {
					Log.e("MobileShopping", e.getMessage());
				}

				dialog.cancel();
			}
		});

		// Et on affiche !!
		dialog.show();

	}

	/**
	 * Partage de la liste courante avec un autre utilisateur de MobileShopping
	 */
	private void sendList() {
		// ouverture de la dialogue
		final Dialog dialog = new Dialog(ShowProductList.this);
		dialog.setContentView(R.layout.sendlist);
		dialog.setTitle(R.string.sendListBySMSTitle);
		dialog.setCancelable(true);

		// bouton annuler
		Button buttonCancel = (Button) dialog
				.findViewById(R.id.dialogBtnCancel);
		buttonCancel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dialog.cancel();
			}
		});
		// bouton sendBySMS
		Button buttonShare = (Button) dialog
				.findViewById(R.id.dialogBtnSendBySMS);

		final Spinner contactsList = (Spinner) dialog
				.findViewById(R.id.spinnerContact);

		// todo recuperer les contacts du tel
		List<? extends Map<String, ?>> contacts = ContactController
				.retrieveContacts(ShowProductList.this);
		String[] from = new String[] { "line1" };
		int[] to = new int[] { android.R.id.text1 };
		contactsList.setAdapter(new SimpleAdapter(ShowProductList.this,
				contacts, android.R.layout.simple_spinner_item, from, to));

		buttonShare.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Map<String, Contact> cat = (Map<String, Contact>) contactsList
						.getSelectedItem();
				Contact contact = cat.get("line1");

				String numPhone = contact.getNumber();
				String textToSend = PatternUtil
						.getStringForSms("Liste des courses:"
								+ products.toString());
				if (PhoneNumberUtils.isWellFormedSmsAddress(numPhone)) {
					SmsManager smsManager = SmsManager.getDefault();
					smsManager.sendTextMessage(numPhone, null, textToSend,
							null, null);

					Toast.makeText(
							ShowProductList.this,
							"Vous venez d'envoyer le sms suivant à " + numPhone
									+ ":\n" + textToSend, Toast.LENGTH_LONG)
							.show();

				} else {
					Toast.makeText(ShowProductList.this,
							"Le numéro de tel: " + numPhone + " est mal formé",
							Toast.LENGTH_LONG).show();
				}

				dialog.cancel();
			}
		});

		// Et on affiche !!
		dialog.show();

	}

	/**
	 * Ajout d'un produit par scan de code barre et de comparaison dans la base
	 * de données.
	 */
	private void addProductScan() {
		try {
			Intent intent = new Intent("com.google.zxing.client.android.SCAN");
			intent.putExtra("SAVE_HISTORY", false);
			startActivityForResult(intent, 0);
		} catch (ActivityNotFoundException e) {
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setMessage(R.string.installBarcodeScanner)
					.setCancelable(false)
					.setPositiveButton(R.string.yes,
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int id) {
									// ouvrir le market vers l'application
									final Intent marketIntent = new Intent(
											android.content.Intent.ACTION_VIEW,
											Uri.parse("http://market.android.com/details?id=com.google.zxing.client.android"));
									startActivity(marketIntent);
								}
							})
					.setNegativeButton(R.string.no,
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int id) {
									dialog.cancel();
								}
							});
			AlertDialog alert = builder.create();
			alert.show();
		}
	}

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent intent) {
		// on vient de revenir dans l'application via l'appli cation de scan
		if (requestCode == 0) {
			if (resultCode == RESULT_OK) {
				// le code barre scannée
				final String contents = intent.getStringExtra("SCAN_RESULT");

				Productlist p = ProductListController.getProduct(
						ShowProductList.this, list.getMlistid(), 1,
						Integer.parseInt(MobileShoppingUtils
								.getSharedPreferences(ShowProductList.this,
										"userid")), contents);

				// est ce un nouveau produit?
				if (p == null) {
					final Dialog dialog = new Dialog(ShowProductList.this);

					dialog.setContentView(R.layout.create_product);
					dialog.setTitle(getResources().getString(
							R.string.createProduct));

					dialog.getWindow().setLayout(LayoutParams.FILL_PARENT,
							LayoutParams.FILL_PARENT);

					// on récupère les catégories disponibles en base locale
					List<Category> categories = DAOFactory.getCategoryDAO(
							ShowProductList.this).findAll();
					List<? extends Map<String, ?>> mapcategories = CategoryController
							.buildMapCategories(categories);
					/*
					 * ArrayAdapter.createFromResource( this,
					 * R.array.categories,
					 * android.R.layout.simple_spinner_item);
					 */
					String[] from = new String[] { "line1" };
					int[] to = new int[] { android.R.id.text1 };
					final Spinner spCategories = (Spinner) dialog
							.findViewById(R.id.spCategorie);
					spCategories.setAdapter(new SimpleAdapter(this,
							mapcategories,
							android.R.layout.simple_spinner_item, from, to));

					Button btnValid = (Button) dialog
							.findViewById(R.id.btnValidCreation);
					btnValid.setOnClickListener(new OnClickListener() {

						@Override
						public void onClick(View v) {
							EditText text = (EditText) dialog
									.findViewById(R.id.editLabelProduct);

							Product p = new Product();
							p.setBarcode(contents);
							p.setDescription(text.getText().toString());
							Map<String, Category> cat = (Map<String, Category>) spCategories
									.getSelectedItem();
							p.setCategoryid(cat.get("line1").getCategoryid());
							p = ProductController.createProduct(
									ShowProductList.this, p);
							if (p != null) {
								Productlist pl = new Productlist(list
										.getMlistid(), -1, 1, Integer
										.valueOf(Constants.statusList.EDITABLE
												.getId()), Integer
										.parseInt(MobileShoppingUtils
												.getSharedPreferences(
														ShowProductList.this,
														"userid")), p
										.getProductid(), new Date());

								// ok on va créer le produit
								pl = ProductListController.createProductList(
										ShowProductList.this, pl);
								pl.setProduct(p);
								appendProduct(pl);
							} else {
								Toast.makeText(
										ShowProductList.this,
										"Le produit ne peut être ajouté car la conexion au server a échoué",
										10);
							}
							dialog.cancel();
						}
					});

					dialog.show();

				} else {

					p = new Productlist(list.getMlistid(), -1, 1,
							Integer.valueOf(Constants.statusList.EDITABLE
									.getId()),
							Integer.parseInt(MobileShoppingUtils
									.getSharedPreferences(ShowProductList.this,
											"userid")), p.getProductid(),
							new Date());

					p = ProductListController.createProductList(
							ShowProductList.this, p);

					p.setProduct(ProductController.getProduct(
							ShowProductList.this, p.getProductid()));
					appendProduct(p);
				}
			}
		}
	}

	/**
	 * Ajout d'un produit dans la liste que nous avons ci-dessous
	 * 
	 * @param p Le produit à ajouter dans la liste
	 */
	private void appendProduct(Productlist p) {
		// ListeController.addProduct(ShowProductList.this, list, p, 1);
		adapter.add(p);
	}

	/**
	 * Lancement de l'intent de recherche d'un supermarché proche de nous
	 * 
	 * @return
	 */
	private void goToMapsStore() {
		Intent browserIntent = new Intent("android.intent.action.VIEW",
				Uri.parse("geo:0,0?q=supermarché"));
		startActivity(browserIntent);
	}
}
